package com.wh.wisdomsite.xbox.server.util;

import java.math.BigDecimal;
import java.text.DecimalFormat;

public class NumberUtils {

	public static final String FORMAT_2 = "0.00";
	public static final String FORMAT_6 = "0.000000";
	public static final int SCALE_6 = 6;
	public static final BigDecimal DECIMAL_1 = new BigDecimal("1");

	public static void main(String [] args) {
		BigDecimal d = new BigDecimal(56.250000);	
		System.out.println("Double.parseDouble : " + Double.parseDouble(String.format("%.2f",d)));
		System.out.println("Double.parseDouble : " + Double.parseDouble(String.format("%.2f",new BigDecimal(56.260000/10))));
	}
	
	//四舍五入
	public static Double roundOff(Object bigDValue){
		return Double.parseDouble(String.format("%.2f",bigDValue));
	}
	
	public static double format(double d, String format) {
		//这个方法在最后一位为5时。不会四舍五入
		return Double.parseDouble(new DecimalFormat(format).format(d));
	}

	public static double format2(double d) {

		return format(d, FORMAT_2);
	}

	public static double format6(double d) {

		return format(d, FORMAT_6);
	}

	public static int getInt(String str) {
		if (str == null || str.equals(""))
			return 0;
		int ret = 0;
		try {
			ret = Integer.parseInt(str);
		} catch (NumberFormatException e) {
			ret = 0;
		}
		return ret;
	}

	/**
	 * 提供精确的加法运算
	 * 
	 * @param v1
	 * @param args
	 * @return 和
	 */
	public static double add(double v1, double... args) {

		BigDecimal b1 = toDecimal(v1);

		for (double d : args) {

			b1 = b1.add(toDecimal(d));
		}
		return b1.doubleValue();
	}

	/**
	 * 提供精确的加法运算
	 * 
	 * @param v1
	 * @param args
	 * @return 和
	 */
	public static BigDecimal add(BigDecimal v1, BigDecimal... args) {

		for (BigDecimal d : args) {

			v1 = v1.add(d);
		}
		return v1;
	}

	/**
	 * 提供精确的乘法运算
	 * 
	 * @param v1
	 * @param args
	 * @return 积
	 */
	public static double mul(double v1, double... args) {

		BigDecimal b1 = new BigDecimal(Double.toString(v1));

		for (double d : args) {

			b1 = b1.multiply(toDecimal(d));
		}
		return b1.doubleValue();
	}

	/**
	 * 提供精确的乘法运算
	 * 
	 * @param v1
	 * @param args
	 * @return 积
	 */
	public static BigDecimal mul(BigDecimal v1, BigDecimal... args) {

		for (BigDecimal d : args) {

			v1 = v1.multiply(d);
		}
		return v1;
	}

	/**
	 * 提供精确的减法运算。
	 * 
	 * @param v1
	 * @param v2
	 * @return 两个参数的差
	 */
	public static double sub(double v1, double v2) {

		return toDecimal(v1).subtract(toDecimal(v2)).doubleValue();
	}

	/**
	 * 提供（相对）精确的除法运算。当发生除不尽的情况时，由scale参数指 定精度，以后的数字四舍五入
	 * 
	 * @param v1
	 *            被除数
	 * @param v2
	 *            除数
	 * @param scale
	 *            表示表示需要精确到小数点以后几位。
	 * @return 两个参数的商
	 */
	public static double div(double v1, double v2, int scale) {

		if (scale < 0) {
			throw new IllegalArgumentException("The scale must be a positive integer or zero");
		}

		return toDecimal(v1).divide(toDecimal(v2), scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	/**
	 * 6位小数精度除法运算（四舍五入）
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 */
	public static double div6(double v1, double v2) {

		return div(v1, v2, SCALE_6);
	}

	/**
	 * 提供精确的小数位四舍五入处理
	 * 
	 * @param v
	 *            需要四舍五入的数字
	 * @param scale
	 *            小数点后保留几位
	 * @return 四舍五入后的结果
	 */
	public static double round(double v, int scale) {

		if (scale < 0) {
			throw new IllegalArgumentException("The scale must be a positive integer or zero");
		}

		return toDecimal(v).divide(DECIMAL_1, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	/**
	 * 提供精确的6位小数四舍五入处理。
	 * 
	 * @param v
	 *            需要四舍五入的数字
	 * @return 四舍五入后的结果
	 */
	public static double round6(double v) {

		return round(v, SCALE_6);
	}

	/**
	 * {@code double} 精确转换为 {@code BigDecimal}
	 * 
	 * @param d
	 * @return BigDecimal
	 */
	public static BigDecimal toDecimal(double d) {

		return new BigDecimal(Double.toString(d));
	}

	/**
	 * 取小值
	 * 
	 * @param n1
	 * @param n2
	 * @return
	 */
	public static BigDecimal min(BigDecimal n1, BigDecimal n2) {

		if (n1 != null && n2 != null) {
			return n1.compareTo(n2) < 0 ? n1 : n2;
		}

		return null;
	}

	/**
	 * 取小值
	 * 
	 * @param n1
	 * @param args
	 * @return
	 */
	public static BigDecimal min(BigDecimal n1, BigDecimal... args) {

		for (BigDecimal d : args) {

			n1 = min(n1, d);
		}
		return n1;
	}
	

	/**
     * 金额分割，四舍五人金额
     * @param s
     * @return
     */
    public static String formatMoney(BigDecimal s){
        String retVal = "";
        String str = "";
        boolean is_positive_integer = false;
        if(null == s){
        	return "0.00";
        }

        if(0 == s.doubleValue()){
        	return "0.00";
        }
        //判断是否正整数
        if(s.toString().indexOf("-") != -1){
        	is_positive_integer = true;
        }else{
        	is_positive_integer = false;
        }
        //是负整数
        if(is_positive_integer){
        	//去掉 - 号
        	s = new BigDecimal(s.toString().substring(1, s.toString().length()));
        }
        str = s.setScale(2, BigDecimal.ROUND_HALF_UP).toString();
        StringBuffer sb = new StringBuffer();
	    String[] strs = str.split("\\.");
	    int j = 1;
	    for(int i = 0; i < strs[0].length(); i++){
	          char a = strs[0].charAt(strs[0].length()-i-1);
	          sb.append(a);
        	  if(j % 3 == 0 && i != strs[0].length()-1){
        		  sb.append(",");
        	  }
	          j++;
	    }
	    String str1 = sb.toString();
	    StringBuffer sb1 = new StringBuffer();
	    for(int i = 0; i < str1.length(); i++){
	          char a = str1.charAt(str1.length()-1-i);
	          sb1.append(a);
	    }
	        sb1.append(".");
	        sb1.append(strs[1]);
	        retVal = sb1.toString();
	        
	   if(is_positive_integer){
	        	retVal = "-" + retVal;
	   }
	   		return retVal;
    }
}
